#!/usr/bin/python
# -*-coding:UTF-8 -*-

# ========================
# @Time  : 2021/3/4
# @Author: Sunny
# ========================
"""
3.5版本以后实现协程的方式
协程：本质上是一个特殊的函数，函数切换非常快
原生的协程
async 加在def前面，定义协程函数
await 只能写在协程函数中，await后面必须是一个可等待对象(协程，任务，asyncio.sleep())
"""
import asyncio


# -----------------------协程函数的定义和调用------------------------------------
# 通过async直接定义协程函数
# async def work1():
#     for i in range(10):
#         print(f'work1--浇花---{i}')
#
#
# # 调用协程函数，返回的是一个协程对象,就像调用生成器一样，返回的是生成器对象
# cor1 = work1()
#
# # 执行协程
# # 3.7以下版本
# asyncio.get_event_loop().run_until_complete(cor1)
# # 3.7以上版本
# # asyncio.run(cor1)

# --------------------------使用原生协程实现多任务--------------------------
# 但是现在工作中很少用这种方式，有直接封装好的库
# 协程中切换

async def work1():
    for i in range(10):
        print(f'work1--浇花---{i}')
        await asyncio.sleep(1)


async def work2():
    for i in range(10):
        print(f'work2--打墙---{i}')
        await asyncio.sleep(1)


# # 调用协程函数，返回的是一个协程对象
# cor1 = work1()
# cor2 = work2()
#
# # 执行协同，是同步执行
# asyncio.run(cor1)
# asyncio.run(cor2)


#---------------------------------------------------------------------------------------------------------------
# 如果需要2个程序异步执行怎么办？
# 解决方案
# 把协程函数创建成任务，当任务运行遇到IO操作耗时等待时，会切换执行一下个任务，切换速度非常快

async def main():
    # 调用协程函数，返回的是一个协程对象
    cor1 = work1()
    cor2 = work2()
    # 把协程创建成任务
    task1 = asyncio.create_task(cor1)
    task2 = asyncio.create_task(cor2)
    await task1
    await task2

if __name__ == '__main__':
    m = main()
    asyncio.run(m)

